const bcrypt = require('bcrypt')
const { getUserInfo } = require('../service/user.service')
const {  userFormateError,userAlreadyExited,userRegisterError,userDoesNotExist,userLoginError,invalidPassword} = require('../constant/err.type')

const userValidator = async (ctx,next) => {
    const { user_name, password } = ctx.request.body
    // 合法性
    if (!user_name || !password) {
        // console.error('用户名或密码为空',ctx.request.body); -》 输出错误日志
        // 手动触发一个error事件，在Koa实例的app上，监听这类事件，并执行对应的错误处理逻辑
        // 执行逻辑：手动触发一个error事件，并且将userFormateError作为参数传递给app.emit，地三个是传递当前请求的上下文
        ctx.app.emit('error',userFormateError,ctx)
        return
    }
    await next()
}
const verifyUserExists = async (ctx,next) => {
    const { user_name } = ctx.request.body
    try {
        const res = await getUserInfo({user_name})
        if (res) {
            console.error('用户名已存在',{user_name});
            ctx.app.emit('error',userAlreadyExited,ctx)
            return 
        }
    } catch (err) {
        console.error('获取用户信息错误',err);
        ctx.app.emit('error',userRegisterError,ctx)
        return
    }
    await next()
}
// 加密
const cryptPassword = async (ctx,next) => {
    const { password } = ctx.request.body
    // 生成一个指定'轮数'的'盐值'
    const salt = bcrypt.genSaltSync(10)
    // 作用： 对密码将进行哈希处理,明文密码转化为密文
    const hash = bcrypt.hashSync(password,salt)
    ctx.request.body.password = hash
    await next()
}
const verifyLogin = async (ctx,next) => {
    // 判断用户是否存在，不存在则报错
    const {user_name,password} = ctx.request.body
    try {
        const res = await getUserInfo({user_name})
        if (!res) {
            console.log('用户不存在',{user_name});
            ctx.app.emit('error',userDoesNotExist,ctx)
            return
        }
        // 密码是否匹配(不匹配:报错)
        // 第一个是用户输入的明文密码，第二个是数据库中存储的密文
        if (!bcrypt.compareSync(password,res.password)) {
            ctx.app.emit('error',invalidPassword,ctx)
            return
        }
    } catch (err) {
        console.error(err);
        return ctx.app.emit('error',userLoginError,ctx)
    }
    await next()
}

module.exports = { userValidator,verifyUserExists,cryptPassword,verifyLogin}